﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Controller2.Models.ViewModels
{
    public class FuncionarioViewModel
    {
        public int ID { get; set; }
        public int Codigo { get; set; }
        public string Nome { get; set; }
        public string Email { get; set; }
        public string Fone { get; set; }
        public string Cidade { get; set; }
        public string Tipo { get; set; }
        public string DataCadastro { get; set; }

        public IEnumerable<FuncionarioViewModel> Listar(ControllerBDModelContainer db, string texto, int filtro)
        {
            IEnumerable<FuncionarioViewModel> cli;
            int codigo = 0;
            if (filtro == 1)
            {
                if (!Int32.TryParse(texto, out codigo))
                {
                    filtro = 0;
                    texto = "";
                }
            }
            if (string.IsNullOrWhiteSpace(texto) || texto.Equals("Digite sua pesquisa"))
            {
                filtro = 0;
                texto = "";
            }
            switch (filtro)
            {
                default:
                    cli = (from p in db.Pessoa.OfType<Pessoa_Func>()
                           select new
                           {
                               ID = p.IdPessoa,
                               Codigo = p.Codigo,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               Tipo = (from t in p.TipoPessoa select t).Select(tp => tp.Tipo).FirstOrDefault(),
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new FuncionarioViewModel
                           {
                               ID = s.ID,
                               Codigo = s.Codigo,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               Tipo = s.Tipo,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
                case 1:
                    cli = (from p in db.Pessoa.OfType<Pessoa_Func>()
                           where p.IdPessoa == codigo
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new FuncionarioViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
                case 2:
                    cli = (from p in db.Pessoa.OfType<Pessoa_Func>()
                           where p.NomePessoa.Contains(texto)
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new FuncionarioViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
                case 3:
                    cli = (from p in db.Pessoa.OfType<Pessoa_Func>()
                           where p.Email.Contains(texto)
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new FuncionarioViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
                case 4:
                    cli = (from p in db.Pessoa.OfType<Pessoa_Func>()
                           where p.Cidade.NomeCidade.Contains(texto)
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new FuncionarioViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
            }
			return cli.OrderBy(o => o.ID);
        }

        public IEnumerable<ClientesViewModel> ProcuraFuncionario(ControllerBDModelContainer db, string texto)
        {
            IEnumerable<ClientesViewModel> func;
            int codigo = 0;
            if (Int32.TryParse(texto, out codigo))
            {
                func = (from t in db.TipoPessoa
                        where t.Tipo.Equals("Funcionário")
                        from p in t.Pessoa
                        where p.IdPessoa == codigo
                        select new
                        {
                            ID = p.IdPessoa,
                            Nome = p.NomePessoa,
                        }).ToList().Select(s => new ClientesViewModel
                       {
                           ID = s.ID,
                           Nome = s.Nome
                       });
            }
            else
            {
                func = (from t in db.TipoPessoa
                        where t.Tipo.Equals("Funcionário")
                        from p in t.Pessoa
                        where p.NomePessoa.Contains(texto)
                        select new
                        {
                            ID = p.IdPessoa,
                            Nome = p.NomePessoa,
                        }).ToList().Select(s => new ClientesViewModel
                       {
                           ID = s.ID,
                           Nome = s.Nome
                       });
            }

			return func.OrderBy(o => o.ID);
        }

        public IEnumerable<ClientesViewModel> ProcuraFreelancer(ControllerBDModelContainer db, string texto)
        {
            IEnumerable<ClientesViewModel> freela;
            int codigo = 0;
            if (Int32.TryParse(texto, out codigo))
            {
                freela = (from t in db.TipoPessoa
                          where t.Tipo.Equals("Freelancer")
                          from p in t.Pessoa
                          where p.IdPessoa == codigo
                          select new
                          {
                              ID = p.IdPessoa,
                              Nome = p.NomePessoa,
                          }).ToList().Select(s => new ClientesViewModel
                       {
                           ID = s.ID,
                           Nome = s.Nome
                       });
            }
            else
            {
                freela = (from t in db.TipoPessoa
                          where t.Tipo.Equals("Freelancer")
                          from p in t.Pessoa
                          where p.NomePessoa.Contains(texto)
                          select new
                          {
                              ID = p.IdPessoa,
                              Nome = p.NomePessoa,
                          }).ToList().Select(s => new ClientesViewModel
                       {
                           ID = s.ID,
                           Nome = s.Nome
                       });
            }

			return freela.OrderBy(o => o.ID);
        }
    }
}